package 集合;

import java.util.HashSet;
import java.util.Set;

public class No202快乐数 {

    /**
     * 「快乐数」定义为：对于一个正整数，每一次将该数替换为它每个位置上的数字的平方和，
     * 然后重复这个过程直到这个数变为 1，也可能是 无限循环 但始终变不到 1。
     * 如果 可以变为  1，那么这个数就是快乐数。
     *
     * 如果 n 是快乐数就返回 True ；不是，则返回 False 。
     * 示例：
     * 输入：19
     * 输出：true
     * 解释：
     * 1^2 + 9^2 = 82
     * 8^2 + 2^2 = 68
     * 6^2 + 8^2 = 100
     * 1^2 + 0^2 + 0^2 = 1
     */

    //使用hashSet去解决,看是否有循环存在,用了循环就不会快乐数,一个数每个位的平方不可能无限大,所以可以用Set
    public static boolean isHappy(int n) {
        Set<Integer> set=new HashSet<>();
        int result=n;
        while(result!=1){
            result=goHappy(result);//获取到平方数
            if(set.contains(result))
                return false;
            set.add(result);
        }
        return true;
    }

    private static int goHappy(int n){
        int sum=0;
        while(n>0){
            int d=n%10;//个位数最后也不会漏掉
            n=n/10;//个位数除以10一定是0
            sum+=d*d;
        }
        return sum;//得到本次的平方数
    }

    public static void main(String[] args) {

        boolean happy = isHappy(19);
        System.out.println(happy);

    }



}
